import pandas as pd
import re

# ---------------------- 1. 读取student.xlsx文件内容并打印 ----------------------
# 读取Excel文件，指定使用openpyxl引擎
df = pd.read_excel('student.xlsx', engine='openpyxl')
# 打印数据基本信息（行数、列数）
print("=== 1. 学生数据基本信息 ===")
print(f"数据总行数：{len(df)} 行")
print(f"数据总列数：{len(df.columns)} 列")
print("列名：", list(df.columns))
# 打印前5行数据（预览）和完整数据
print("\n前5行数据预览：")
print(df.head())
print("\n完整学生数据：")
print(df.to_string(index=False))  # 不显示索引，更清晰


# ---------------------- 2. 按性别统计学生人数 ----------------------
print("\n=== 2. 按性别统计人数 ===")
gender_count = df['性别'].value_counts()
# 遍历统计结果并打印
for gender, count in gender_count.items():
    print(f"{gender}生：{count} 人")
# 计算性别占比（可选，增强结果）
gender_ratio = df['性别'].value_counts(normalize=True) * 100
print("性别占比：")
for gender, ratio in gender_ratio.items():
    print(f"{gender}生：{ratio:.1f}%")


# ---------------------- 3. 按年龄段统计学生人数 ----------------------
print("\n=== 3. 按年龄段统计人数 ===")
# 定义年龄段划分规则（根据学生年龄分布设定合理区间）
age_bins = [0, 18, 25, 35, 50, 100]  # 年龄段边界
age_labels = ['18岁及以下', '19-25岁', '26-35岁', '36-50岁', '50岁以上']  # 对应标签
# 新增"年龄段"列，按规则划分
df['年龄段'] = pd.cut(df['年龄'], bins=age_bins, labels=age_labels, right=False)
# 统计各年龄段人数
age_group_count = df['年龄段'].value_counts().sort_index()  # 按年龄段顺序排序
# 打印统计结果
for age_group, count in age_group_count.items():
    print(f"{age_group}：{count} 人")


# ---------------------- 4. 按地区统计学生人数 ----------------------
print("\n=== 4. 按地区统计人数（外省按省份，海南按市县） ===")

def extract_region(address):
    """
    提取地区：海南地址提取市县，外省地址提取省份
    :param address: 家庭地址字符串
    :return: 提取后的地区（如"儋州市"、"吉林省"）
    """
    address = str(address).strip()  # 确保地址为字符串且去空格
    # 海南地址处理：匹配"海南省XX市/县"格式
    hainan_pattern = r'海南省([^市县区]+[市县区])'
    hainan_match = re.search(hainan_pattern, address)
    if hainan_match:
        return hainan_match.group(1)  # 返回海南的市县（如"儋州市"）
    
    # 外省地址处理：匹配"XX省"格式（排除海南省）
    other_province_pattern = r'([^省]+省)'
    other_province_match = re.search(other_province_pattern, address)
    if other_province_match:
        return other_province_match.group(1)  # 返回外省的省份（如"吉林省"）
    
    # 特殊情况：地址格式不标准时返回"未知地区"
    return "未知地区"

# 新增"地区"列，调用函数提取地区
df['地区'] = df['家庭地址'].apply(extract_region)
# 统计各地区人数
region_count = df['地区'].value_counts()
# 打印统计结果
for region, count in region_count.items():
    print(f"{region}：{count} 人")

# 额外统计：海南与外省总人数（可选，增强结果）
hainan_regions = [r for r in region_count.index if '市' in r or '县' in r]  # 海南地区含"市/县"
hainan_total = sum(region_count[r] for r in hainan_regions)
other_total = len(df) - hainan_total
print(f"\n海南省内学生总数：{hainan_total} 人")
print(f"外省学生总数：{other_total} 人")